package edu.unicauca.opentextbook.controladores;

import edu.unicauca.opentextbook.entidades.Grupo;
import edu.unicauca.opentextbook.entidades.Libro;
import edu.unicauca.opentextbook.entidades.Pertenece;
import edu.unicauca.opentextbook.entidades.Usuario;
import edu.unicauca.opentextbook.fachadas.GrupoFacade;
import edu.unicauca.opentextbook.fachadas.LibroFacade;
import edu.unicauca.opentextbook.fachadas.PerteneceFacade;
import edu.unicauca.opentextbook.fachadas.RolFacade;
import edu.unicauca.opentextbook.fachadas.UsuarioFacade;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.transaction.SystemException;

@ManagedBean(name = "libroController")
@ViewScoped
public class LibroController extends BaseController implements Serializable {

    //Controladores
    @ManagedProperty("#{loginController}")
    private LoginController loginController;
    //EJBs
    @EJB
    private LibroFacade libroFacade;
    @EJB
    private GrupoFacade grupoFacade;
    @EJB
    private PerteneceFacade perteneceFacade;
    @EJB
    private RolFacade rolFacade;
    @EJB
    private UsuarioFacade usuarioFacade;
    //Objetos
    private Libro libro;
    private Grupo grupo;

    //Metodos
    @PostConstruct
    public void init() {
        libro = new Libro();
        grupo = new Grupo();
    }

    public void crearLibro() {
        final Usuario usuario = usuarioFacade.buscarUsuarioPorNick(loginController.getNick());
        final Pertenece perteneceSenior = new Pertenece();
        final Pertenece perteneceEscritor = new Pertenece();

        grupo.setLibro(libro);

        perteneceSenior.setGrupo(grupo);
        perteneceSenior.setRol(rolFacade.buscarRol(1));
        perteneceSenior.setUsuario(usuario);

        perteneceEscritor.setGrupo(grupo);
        perteneceEscritor.setRol(rolFacade.buscarRol(2));
        perteneceEscritor.setUsuario(usuario);

        try {
            userTransaction.begin();

            libroFacade.create(libro);
            grupoFacade.create(grupo);
            perteneceFacade.create(perteneceSenior);
            perteneceFacade.create(perteneceEscritor);
            commitTransaction();

            anadirMensajeInfo("Registro Exitoso");

            libro = new Libro();
            grupo = new Grupo();

        } catch (Exception ex) {
            if (ex instanceof SQLException) {
                if (ex.getLocalizedMessage().contains("OPENTEXTBOOK.UK_NOMRE_LIBRO")) {
                    anadirMensajeError("El Nombre del Libro ya ha sido registrado");
                } else if (ex.getLocalizedMessage().contains("OPENTEXTBOOK.UK_NOMBRE_GRUPO")) {
                    anadirMensajeError("El Nombre del Grupo ya ha sido registrado");
                } else {
                    anadirMensajeError("Error al registrar, por favor contacte al Administrador");
                }
            } else {
                anadirMensajeError("Error al registrar, por favor contacte al Administrador");
            }
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);

            try {
                userTransaction.rollback();
            } catch (IllegalStateException e) {
                Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, e);
            } catch (SecurityException e) {
                Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, e);
            } catch (SystemException e) {
                Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, e);
            }
        }
    }

    //Converter
    @FacesConverter(forClass = Libro.class)
    public static class LibroControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            LibroController controller = (LibroController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "libroController");
            return controller.libroFacade.find(getKey(value));
        }

        int getKey(String value) {
            int key;
            key = Integer.parseInt(value);
            return key;
        }

        String getStringKey(int value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Libro) {
                Libro o = (Libro) object;
                return getStringKey(o.getIdLibro());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Libro.class.getName());
            }
        }
    }

    //Getters y Setters
    public Libro getLibro() {
        return libro;
    }

    public void setLibro(Libro libro) {
        this.libro = libro;
    }

    public Grupo getGrupo() {
        return grupo;
    }

    public void setGrupo(Grupo grupo) {
        this.grupo = grupo;
    }

    public LoginController getLoginController() {
        return loginController;
    }

    public void setLoginController(LoginController loginController) {
        this.loginController = loginController;
    }
}
